#pragma once

#include <string>
#include <fstream>
#define debug(format, ...) Logger::instance()->log(Logger::DEBUG, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define info(format, ...) Logger::instance()->log(Logger::INFO, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define warnning(format, ...) Logger::instance()->log(Logger::WARNNING, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define error(format, ...) Logger::instance()->log(Logger::ERROR, __FILE__, __LINE__, format, ##__VA_ARGS__)
#define fatal(format, ...) Logger::instance()->log(Logger::FATAL, __FILE__, __LINE__, format, ##__VA_ARGS__)

using namespace std;

namespace Louis {
    namespace utility {
        class Logger
        {
        public:
            enum Level// 日志级别
            {
                DEBUG = 0,
                INFO,
                WARNNING,
                ERROR,
                FATAL,
                LEVEL_COUNT
            };
            static Logger* instance();// 单例模式
            void open(const string &filename);// 打开文件
            void close();// 关闭文件
            void log(Level level, const char* file, int line, const char* fromat, ...);
            void max(int bytes);
            void level(int level);

        private:
            Logger();
            ~Logger();
            void rotate();

        private:
            string m_filename;// 文件名
            ofstream m_fout;// 文件输出流
            int m_max;
            int m_size;
            int m_level;
            static const char* s_level[LEVEL_COUNT];// 静态字符串数组
            static Logger *m_instance;// 单例模式
        };
    }
}

